#ifndef _ADT_Hilmans_Package_H
#define _ADT_Hilmans_Package_H
//------------------------------------------------------------------------
// _HilPack_General
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define _HilPack_General_Nil 0

int _HilPack_General_LongStr(char *InputS);
// return Panjang string InputS, "_HilPack_" akan return 9

int _HilPack_General_ExistChar(char *InputS, char C);
// return Apakah ada karakter pertama C di string InputS, return (posisikarakter+1) jika ya, 0 klo nggak
// misalkan mencari'L' dari "FORMULA", returnnya adalah 6  <--(5+1)

int _HilPack_General_AddChr(char InputS[], char InputC);
// menambahkan karakter InputC ke belakang string InputS, "hahaha" + 'X'

int _HilPack_General_AddChrF(char InputS[], char InputC);
// menambahkan karakter InputC ke depan string InputS, 'X' + "hahaha", maksud akhiran F pada fungsi adalah First

int _HilPack_General_DelChr(char InputS[]);
// menghapus karakter paling belakang string, "abcdef" --> "abcde", return 0 jika string sudah kosong

int _HilPack_General_DelChrF(char InputS[]);
// menghapus karakter paling depan string, "abcdef" --> "bcdef", return 0 jika string sudah kosong

int _HilPack_General_AddStr(char S1[], char S2[]);
// mengubah string S1 dengan cara menambah S2 di belakang S1 sehingga S1=S1+S2,  misalkan S1="abc",S2="xyz", maka S1 nanti "abcxyz"

int _HilPack_General_CopyStr(char Output[], char Input[]);
// menghapus Output dulu, lalu menggandakan string Input ke string Output

int _HilPack_General_ParseStr(char *StrIdx, char *InputS);
// ini nggak general, dipakenya pas ADT _HilPack_Excel

int _HilPack_General_ParseTwo(char *One, char *Two, char *InputS);
// bila input string adalah "abcg,sdef", maka One="abcg", Two="sdef"  tanda koma adalah pemisah

int _HilPack_General_ParseThree(char *One, char *Two, char* Three, char *InputS);
// bila input string adalah "abcg,sdef,babL", maka One="abcg", Two="sdef", Three="babL"   tanda koma adalah pemisah

int _HilPack_General_ParseColon(char *One, char *Two, char *InputS);
// bila input string adalah "abcg:sdef", maka One="abcg", Two="sdef"   tanda titik 2 adalah pemisah

int _HilPack_General_IsCell(char Input[]);
// jika string INput berupa Cell, return 1, return 0 jika tidak. Contohnya "A5" akan return 1, "rf23" akan return 0

int _HilPack_General_IsNum(char InputC);
// dipakenya pas di ADT _HilPack_Excel

int _HilPack_General_ParseCell(int *OutKol, int *OutBar, char *InputS);
// mengubah tipe Cell menjadi kolom dan baris, misalkan InputS adalah "D17", maka OutKol=4, OutBar=17

int _HilPack_General_ParseArea(int *Kol1, int *Bar1, int *Kol2, int *Bar2, char *InputS);
// mengubah tipe area menjadi Kolom dan Baris, misalkan InputS adalah ""

int _HilPack_General_AddStrF(char S1[], char S2[]);
// mengubah string S1 dengan cara menambah S2 di depan S1, sehingga S1=S1+S2,  misalkan S1="abc",S2="xyz", maka S1 nanti "xyzabc"

int _HilPack_General_IsArea(char *InputS);
// mengecek apakah InputS adalah area. Jika InputS adalah "A5:H24" return 1, jika "E23:Hahaha" return 0

int _HilPack_General_GetStr(char *OutputS ,char *InputS, int Start, int Stop);
// misalkan Start=2, Stop=5, maka OutputS=InputS[2]..InputS[5], contoh InputS="abcdefgh", maka OutputS="cdef"

int _HilPack_General_SameStr(char *S1, char *S2);
// mengecek apakah sedua string input sama

int _HilPack_General_ExistSub(char *OutputS,char *InputS);
// mengecek apakah InputS merupakan SubString dari OutputS. Contoh OutputS="hilman's package", jika InputS="pack" maka return 1
// jika InputS="test" maka return 0

int _HilPack_General_IsChar(char InputC);
// dipake pas _HilPack_Excel

int _HilPack_General_IsCell_2(char *InputS);
// versi lama dari _HilPack_General_IsCell

int _HilPack_General_IsString (char *InputS);
// dipake pas _HilPack_Excel

int _HilPack_General_DelStrNum(char *OutputS, int Num);
// menghapus sejumlah string di belakang OutputS, misalkan Num=3, OutputS="testings", maka OutputS="testi" , hilang 3 karakter di belakang

int _HilPack_General_DelStrNumF(char *OutputS, int Num);
// menghapus sejumlah string di depan OutputS, misalkan Num=3, OutputS="testings", maka OutputS="tings" , hilang 3 karakter di depan


//------------------------------------------------------------------------
// _HilPack_StackINT
#define _HilPack_StackINT_Top(S) (S).TOP
#define _HilPack_StackINT_InfoTop(S) (S).T[(S).TOP]
#define _HilPack_StackINT_Size(S) (S).Size
#define _HilPack_StackINT_Nil 0
typedef int _HilPack_StackINT_infotype;
typedef int _HilPack_StackINT_address;
typedef struct { _HilPack_StackINT_infotype *T;
                 _HilPack_StackINT_address TOP;
                 int Size;
                 } _HilPack_StackINT;
int _HilPack_StackINT_CreateEmpty(_HilPack_StackINT *S, int Size);
int _HilPack_StackINT_Destruct(_HilPack_StackINT *S);
int _HilPack_StackINT_IsEmpty(_HilPack_StackINT S);
int _HilPack_StackINT_IsFull(_HilPack_StackINT S);
int _HilPack_StackINT_Push(_HilPack_StackINT *S, _HilPack_StackINT_infotype X);
int _HilPack_StackINT_Pop(_HilPack_StackINT *S, _HilPack_StackINT_infotype *X);



//------------------------------------------------------------------------
// _HilPack_StackSTR

#define _HilPack_StackSTR_Top(S) (S).TOP
#define _HilPack_StackSTR_InfoTop(S) (S).T[(S).TOP]
#define _HilPack_StackSTR_Size(S) (S).Size
#define _HilPack_StackSTR_Nil 0

typedef char _HilPack_StackSTR_infotype[100];
typedef int _HilPack_StackSTR_address;
typedef struct { _HilPack_StackSTR_infotype *T;
                 _HilPack_StackSTR_address TOP;
                 int Size;
                 } _HilPack_StackSTR;
int _HilPack_StackSTR_CreateEmpty(_HilPack_StackSTR *S, int Size);
int _HilPack_StackSTR_Destruct(_HilPack_StackSTR *S);
int _HilPack_StackSTR_IsEmpty(_HilPack_StackSTR S);
int _HilPack_StackSTR_IsFull(_HilPack_StackSTR S);
int _HilPack_StackSTR_Push(_HilPack_StackSTR *S, _HilPack_StackSTR_infotype X);
int _HilPack_StackSTR_Pop(_HilPack_StackSTR *S, _HilPack_StackSTR_infotype *X);


//------------------------------------------------------------------------
// _HilPack_MesinKarakter

#define _HilPack_MesinKarakter_FILENAME "pita.txt"
#define _HilPack_MesinKarakter_MARK '.'
#define _HilPack_MesinKarakter_BLANK ' '
#define _HilPack_MesinKarakter_NMax 50
char _HilPack_MesinKarakter_CC; // current character
FILE *_HilPack_MesinKarakter_f;
int _HilPack_MesinKarakter_START();
int _HilPack_MesinKarakter_ADV();
int _HilPack_MesinKarakter_END();


//------------------------------------------------------------------------
// _HilPack_MesinKata

#define _HilPack_MesinKata_MARK '.'
#define _HilPack_MesinKata_BLANK ' '
#define _HilPack_MesinKata_NMax 50


typedef struct{
	char TabKata[_HilPack_MesinKata_NMax];
	int Length;
} _HilPack_MesinKata;
_HilPack_MesinKata _HilPack_MesinKata_CKata;
int _HilPack_MesinKata_IGNOREBLANK();
int _HilPack_MesinKata_ADVKATA();
int _HilPack_MesinKata_salinKata();
int _HilPack_MesinKata_tulisKata();
int _HilPack_MesinKata_isKataSama(_HilPack_MesinKata K1, _HilPack_MesinKata K2);
int _HilPack_MesinKata_INITAKSES();


//------------------------------------------------------------------------


#define _HilPack_Excel_MaxBaris 100
// baris : 1..100
#define _HilPack_Excel_MaxKolom 26
// kolom : A..Z
typedef struct {
    int baris;
    int kolom;
    _HilPack_MesinKata value;  // nampung nilai. Coba cek ADT masing-masing, Kata atau kata (k besar atau k kecil), case sensitive
    int type;    
} _HilPack_Excel_cell;
//type 0 = tidak ada isinya
//type 1 = string/karakter
//type 2 = integer
//type 3 = formula
//type 4 = boolean
_HilPack_Excel_cell _HilPack_Excel_Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1];
#define _HilPack_Matrices _HilPack_Excel_cell[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1] 

int _HilPack_Excel_CopyKata(_HilPack_MesinKata *Output, char Input[]);
int _HilPack_Excel_CopyToKata(_HilPack_MesinKata *Output, _HilPack_MesinKata Input);
int _HilPack_Excel_writeCell(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1], int InKol, int InBar, _HilPack_MesinKata value);
int _HilPack_Excel_writeCellParsing(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1], char *InputS, _HilPack_MesinKata value);
int _HilPack_Excel_writeStr(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1], int InKol, int InBar, char *InputS);
int _HilPack_Excel_writeStrParsing(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1], char *Cell, char *InputS);
int _HilPack_Excel_writeStrArea(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1], int Kol1, int Bar1, int Kol2, int Bar2, char *InputS);
int _HilPack_Excel_writeStrAreaParsing(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1], char *Cell, char *InputS);
int _HilPack_Excel_removeCell(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1], int InKol, int InBar);
int _HilPack_Excel_removeCellParsing(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1], char*InputS);
int _HilPack_Excel_removeArea(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1], int Kol1, int Bar1, int Kol2, int Bar2);
int _HilPack_Excel_removeAreaParsing(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1], char*InputS);
int _HilPack_Excel_AddChr2(_HilPack_MesinKata *S, char InputC);
int _HilPack_Excel_conversidesimal (char CC);
int _HilPack_Excel_PisahCell (int *B1,int *B2, int *K1, int *K2, char Input[]);
int _HilPack_Excel_displayMatrixRange(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1], int Kol1, int Bar1, int Kol2, int Bar2);
int _HilPack_Excel_displayMatrixRangeParsing(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1], char *InputS);
int _HilPack_Excel_displayMatrix(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1], int InKol, int InBar);
int _HilPack_Excel_displayMatrixParsing(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1], char *InputS);
int _HilPack_Excel_display(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1]);
int _HilPack_Excel_displayFormula(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1], int Kol1, int Bar1, int Kol2, int Bar2);
int _HilPack_Excel_displayFormulaParsing(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1], char *InputS);
//int _HilPack_Excel_displayRange(int);

int _HilPack_Excel_GetOp(char *OutputS,int L);
int _HilPack_Excel_GetUnikOp(char *OutputS,int L);
int _HilPack_Excel_TotalOp();
int _HilPack_Excel_TotalUnikOp();
int _HilPack_Excel_Preced(char *InputS);
int _HilPack_Excel_IsOp(char *InputS);
int _HilPack_Excel_IsNum(char InputC);
int _HilPack_Excel_IsNumber(char *InputS);
int _HilPack_Excel_ExistOp(char *InputS);
int _HilPack_Excel_ExistUnikOp(char *InputS);
int _HilPack_Excel_FilterForm(char *InputS);
int _HilPack_Excel_Parse(_HilPack_StackSTR *Val, _HilPack_StackSTR *Op, char *InputS);
int _HilPack_Excel_ParseID(_HilPack_StackINT *IVal, _HilPack_StackINT *IOp, _HilPack_StackINT *LocOp,char *InputS);
int _HilPack_Excel_Eval(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1], char *OutputS,char *InputS);
int _HilPack_Excel_EvalCell(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1], char *OutputS, char *InputS);
int _HilPack_Excel_EvalNoMatrix(char *OutputS,char *InputS);
char * _HilPack_Excel_PrintEval(_HilPack_Excel_cell Matriks[_HilPack_Excel_MaxKolom+1][_HilPack_Excel_MaxBaris+1], char *InputS);
char * _HilPack_Excel_PrintEvalNoMatrix(char *InputS);

//----------------------------------------------------------------------
// _HilPack_Set_INT

typedef struct {
   int *Data;
   int Top; 
   int Size;
} _HilPack_Set_INT ;

// Membuat set kosong dengan size tertentu
int _HilPack_Set_INT_CreateSetINT(_HilPack_Set_INT *InSet,int Size); 

int _HilPack_Set_INT_DeleteSetINT(_HilPack_Set_INT *InSet); 

// bila set kosong-> return 1, bila ada isinya -> return 0 
int _HilPack_Set_INT_NoSetINT(_HilPack_Set_INT InSet); 

// bila set penuh-> return 1, bila ada isinya -> return 0 
int _HilPack_Set_INT_FullSetINT(_HilPack_Set_INT InSet); 

// Mengecek apakah value merupakan bagian dari set, return posisi angka jika ya, return 0 jika tidak
int _HilPack_Set_INT_ExistSetINT(_HilPack_Set_INT InSet, int Value); 

// Menambahkan angka pada set, return posisi angka jika berhasil, return 0 jika gagal (angka sudah ada di set, atau sudah penuh)
int _HilPack_Set_INT_AddSetINT(_HilPack_Set_INT *InSet, int Value); 

// Mengurangkan angka pada set, return posisi angka terhapus jika berhasil, return 0 jika gagal (angka tidak ada di set)
int _HilPack_Set_INT_DelSetINT(_HilPack_Set_INT *InSet, int Value); 

// Intersection dua set
int _HilPack_Set_INT_ANDSetINT(_HilPack_Set_INT InSet1, _HilPack_Set_INT InSet2, _HilPack_Set_INT *OutSet); 

// Gabungan 2 set
int _HilPack_Set_INT_ORSetINT(_HilPack_Set_INT InSet1, _HilPack_Set_INT InSet2, _HilPack_Set_INT *OutSet); 

// Menggandakan Set, return 1 jika berhasil, return 0 jika InSet kosong
int _HilPack_Set_INT_CopySetINT(_HilPack_Set_INT *OutSet, _HilPack_Set_INT InSet);

int _HilPack_Set_INT_CopySetINTSize(_HilPack_Set_INT *OutSet, _HilPack_Set_INT InSet, int SetSize);

// Gabungan 2 set
int _HilPack_Set_INT_PlusSetINT(_HilPack_Set_INT InSet1, _HilPack_Set_INT InSet2, _HilPack_Set_INT *OutSet); 

// Set 1 dikurangi set 2
int _HilPack_Set_INT_MinusSetINT(_HilPack_Set_INT InSet1, _HilPack_Set_INT InSet2, _HilPack_Set_INT *OutSet); 

// Gabungan 2 set
int _HilPack_Set_INT_PlusSetInINT(_HilPack_Set_INT *InSet1, _HilPack_Set_INT InSet2); 

// Set 1 dikurangi set 2
int _HilPack_Set_INT_MinusSetInINT(_HilPack_Set_INT *InSet1, _HilPack_Set_INT InSet2); 

int _HilPack_Set_INT_PrintSetINT(_HilPack_Set_INT InSet);

//----------------------------------------------------------------------
// _HilPack_Hash_STR

#define _HilPack_Hash_STR_Length 10
#define _HilPack_Hash_STR_Size 100

typedef struct {
   char Data[_HilPack_Hash_STR_Size+1][_HilPack_Hash_STR_Length];
   int Top;     
} _HilPack_Hash_STR;

int _HilPack_Hash_STR_DeleteHashSTR(_HilPack_Hash_STR *H);
// Menghapus Hash

int _HilPack_Hash_STR_EmptyHashSTR(_HilPack_Hash_STR H);
// Return 1 jika H kosong, return 0 jika ada isinya

int _HilPack_Hash_STR_FullHashSTR(_HilPack_Hash_STR H);
// return 1 jika H penuh, return 0 jika belum kosong

int _HilPack_Hash_STR_GetSTRHashSTR(_HilPack_Hash_STR H, int InIdx, char *OutH);
// OutH akan menampung string hasil dari indeks yang diberikan, OutH tidak berubah jika indeks tidak terdapat pada H

int _HilPack_Hash_STR_GetIdxHashSTR(_HilPack_Hash_STR H, char *InSTR);
// return Indeks dari Input String yang diberikan (kebalikan dari GetSTRHashSTR), return 0 jika Input String tidak ditemukan pada H

int _HilPack_Hash_STR_AddHashSTR(_HilPack_Hash_STR *H, char *InSTR);
// menambah string baru pada H, indeksnya otomatis diberikan

int _HilPack_Hash_STR_DelNumHashSTR(_HilPack_Hash_STR *H, int Idx);
// menghapus isi H dengan input Indeks

int _HilPack_Hash_STR_DelHashSTR(_HilPack_Hash_STR *H, char *InSTR);
// menghapus isi H dengan input String

int _HilPack_Hash_STR_PrintHashSTR(_HilPack_Hash_STR H);
// menampilkan isi H

//----------------------------------------------------------------------
// _HilPack_Graph

#define _HilPack_Graph_From 100
#define _HilPack_Graph_To 100
#define _HilPack_Graph_Maxname 100
#define _HilPack_Graph_Size 100
#define _HilPack_Graph_ReadLine 200
#define _HilPack_Graph_LongDelay 99999

typedef struct {      
   float Data[_HilPack_Graph_From+1][_HilPack_Graph_To+1];  // Matrix Adjacency
   _HilPack_Hash_STR Node;                                  // menampung nama node
   float FloatVal[_HilPack_Graph_Size];                     // Nilai Float
   char StrVal[_HilPack_Graph_Size][_HilPack_Graph_Maxname+1]; // Nilai String
   int IntVal[_HilPack_Graph_Size];                            // Nilai Integer
   int Total;                                                  // Total Node
} _HilPack_Graph;                                              

int _HilPack_Graph_DeleteGraph(_HilPack_Graph *G);
// Menghapus Semua Node pGada 

int _HilPack_Graph_FullGraph(_HilPack_Graph G);
// Return 1 jika Node G penuh, 0 sebaliknya

int _HilPack_Graph_EmptyGraph(_HilPack_Graph G);
// Return 1 jika G tidak punya Node, 0 sebaliknya

int _HilPack_Graph_ValidNumNode(_HilPack_Graph G, int Node);
// Return 1 jika Node terdapat pada G

int _HilPack_Graph_ValidNode(_HilPack_Graph G, char *Name);
// Return 1 Jika Node dengan Nama di Variabel Name terdapat pada G

int _HilPack_Graph_AddNode(_HilPack_Graph *G, char *Name,float inFloatVal, char *inStrVal, int inIntVal);
// Menambahkan Node pada G, dengan input Nama Node, Nilai Float, Nilai String, Nilai Integer

int _HilPack_Graph_AddNumNodeTime(_HilPack_Graph *G, int From, int To, float Time, int Direction);
// fungsi ini mengubah Matrix Adjacency pada G
// Menambahkan nilai dari Node From ke Node To, nilainya pada variabel Time
// Contoh From=2, To=5, Time=10
// Jika Direction=0, maka  jarak (2 ke 5) dan (5 ke 2) bernilai 10 (tidak peduli arah)
// Jika Direction=1, maka  jarak (2 ke 5) bernilai 10, tetapi (5 ke 2) tidak diapa-apakan (peduli arah)

int _HilPack_Graph_AddNumNodeTimeDirection(_HilPack_Graph *G, int From, int To, float Time);
// Sama seperti _HilPack_Graph_AddNumNodeTime, hanya Direction=1

int _HilPack_Graph_AddNumNodeTimeNoDirection(_HilPack_Graph *G, int From, int To, float Time);
// Sama seperti _HilPack_Graph_AddNumNodeTime, hanya Direction=0

int _HilPack_Graph_AddNodeTime(_HilPack_Graph *G, char *From, char *To, float Time, int Direction);
// Sama seperti _HilPack_Graph_AddNumNodeTime,
// hanya saja From dan To berupa String
// contohnya From="Test", To="Rumah"
// otomatis From dan To akan dikonversi indeksnya berdasarkan Node pada graph G, lalu dijalankan indeks integernya ke _HilPack_Graph_AddNumNodeTime

int _HilPack_Graph_AddNodeTimeDirection(_HilPack_Graph *G, char *From, char *To, float Time);
// Sama seperti _HilPack_Graph_AddNodeTime, hanya Direction=1

int _HilPack_Graph_AddNodeTimeNoDirection(_HilPack_Graph *G, char *From, char *To, float Time);
// Sama seperti _HilPack_Graph_AddNodeTime, hanya Direction=1

int _HilPack_Graph_DelNumNode(_HilPack_Graph *G, int DelNum);
// Menghapus Node pada graph G

int _HilPack_Graph_DelNode(_HilPack_Graph *G, char *DelName);
// Sama seperti _HilPack_Graph_DelNumNode
// hanya saja otomatis String DelName akan dicari indeksnya, lalu akan dijalankan pada _HilPack_Graph_DelNumNode

int _HilPack_Graph_PrintGraph(_HilPack_Graph G);
// Print isi graph, yaitu Matix adjacency-nya, Indeks dan Nama Node-nya, FloatVal, StrVal, dan IntVal-nya

int _HilPack_Graph_LoadFile(_HilPack_Graph *G, char *InFile, int Direction);
// Loading isi file ke graph G, namanya pada string InFile
// Jika Direction=0, maka tidak peduli arah
// Jika Direction=1, maka peduli arah

int _HilPack_Graph_LoadFileNoDirection(_HilPack_Graph *G, char *InFile);
// sama seperti _HilPack_Graph_LoadFile, hanya Direction=1

int _HilPack_Graph_LoadFileDirection(_HilPack_Graph *G, char *InFile);
// sama seperti _HilPack_Graph_LoadFile, hanya Direction=0

int _HilPack_Graph_NumGoTime(_HilPack_Graph G, int From, int To, float FileSize, _HilPack_Set_INT *PathResult, float *Result, _HilPack_Set_INT Path, float Traverse);
//  Pakai Pemisalan
//  Untuk variabel Graph, from 4, to 1, ukuran data 1000 byte, hitung Jarak 4 ke 1
//  Lintasan dimasukkan ke variabel Path, waktu tempuh dimasukkan ke variabel Nilai
//  Kalau mau jarak 1 ke 4, posisi 4 ama 1 dibalik aja. Yang penting kiri itu 'From', kanan itu 'To'
//  Variabel path untuk menampung node yang ditempuh
//  Variabel Traverse untuk menampung waktu yang ditempuh

int _HilPack_Graph_NumGoBackTime(_HilPack_Graph G, int From, int To, float FileSize, _HilPack_Set_INT *PathResult, _HilPack_Set_INT *PathBack, float *Result, _HilPack_Set_INT Path, float Traverse);
// sama seperti _HilPack_Graph_NumGoTime, hanya saja nilai kembali ke awal juga dihitung

int _HilPack_Graph_NumGoBackProcessTime(_HilPack_Graph G, int From, int To, float FileSize, _HilPack_Set_INT *PathResult, float *Result, _HilPack_Set_INT Path, float Traverse);
// sama seperti _HilPack_Graph_NumGoTime, hanya saja nilai kembali ke awal dan waktu proses juga dihitung
// Belum diimplementasikan !

int _HilPack_Graph_GoTime(_HilPack_Graph G, char *From, char *To, float FileSize, _HilPack_Set_INT *PathResult, float *Result, _HilPack_Set_INT Path, float Traverse);
// Sama seperti _HilPack_Graph_NumGoTime, hanya  From dan To berupa string
// String ini akan dicari indeksnya berdasarkan graph G, lalu dijalankan ke _HilPack_Graph_NumGoTime

int _HilPack_Graph_GoBackTime(_HilPack_Graph G, char *From, char *To, float FileSize, _HilPack_Set_INT *PathResult, _HilPack_Set_INT *PathBack, float *Result, _HilPack_Set_INT Path, float Traverse);
// sama seperti _HilPack_Graph_GoTime, hanya saja nilai kembali ke awal juga dihitung

int _HilPack_Graph_GoBackProcessTime(_HilPack_Graph G, char *From, char *To, float FileSize, _HilPack_Set_INT *PathResult, float *Result, _HilPack_Set_INT Path, float Traverse);
// sama seperti _HilPack_Graph_GoTime, hanya saja nilai kembali ke awal dan waktu proses juga dihitung
// Belum diimplementasikan !

int _HilPack_Graph_PrintPath(_HilPack_Graph G, _HilPack_Set_INT Path);
// Mengeprint Path berdasarkan graph G

//Enam fungsi di bawah sama seperti fungsi-fungsi di atas, hanya di depannya ditambah path,
//tetapi enam fungsi di bawah ini yang lebih baik digunakan karena parameternya lebih sedikit
//(variabel temporari sudah ditangani, jadi variabel Path dan Traverse dihilangkan)
int _HilPack_Graph_PathNumGoTime(_HilPack_Graph G, int From, int To, float FileSize, _HilPack_Set_INT *PathResult, float *Result);
int _HilPack_Graph_PathNumGoBackTime(_HilPack_Graph G, int From, int To, float FileSize, _HilPack_Set_INT *PathResult, _HilPack_Set_INT *PathBack, float *Result);
int _HilPack_Graph_PathNumGoBackProcessTime(_HilPack_Graph G, int From, int To, float FileSize, _HilPack_Set_INT *PathResult, float *Result);
int _HilPack_Graph_PathGoTime(_HilPack_Graph G, char *From, char *To, float FileSize, _HilPack_Set_INT *PathResult, float *Result);
int _HilPack_Graph_PathGoBackTime(_HilPack_Graph G, char *From, char *To, float FileSize, _HilPack_Set_INT *PathResult, _HilPack_Set_INT *PathBack, float *Result);
int _HilPack_Graph_PathGoBackProcessTime(_HilPack_Graph G, char *From, char *To, float FileSize, _HilPack_Set_INT *PathResult, float *Result);

#endif
